package com.gylang.springmini.registry;

import com.gylang.springmini.exception.BeanDefinitionStoreException;
import com.gylang.springmini.exception.NoSuchBeanDefinitionException;
import com.gylang.springmini.support.BeanDefinition;

/**
 * @author gylang
 * data 2021/11/13
 */
public interface BeanDefinitionRegistry extends AliasRegistry{

    /**
     * 注册bean的定义
     * @param beanName bean的名称
     * @param beanDefinition bean的定义信息
     * @throws BeanDefinitionStoreException bean的定义已存在
     */
    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;

    /**
     * 移出bean的定义
     * @param beanName bean的名称
     * @throws NoSuchBeanDefinitionException 不存在该bean的定义
     */
    void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;


    /**
     * 获取该bean的定义
     * @param beanName bean的名称
     * @return bean的定义
     * @throws NoSuchBeanDefinitionException 不存在该bean的定义
     */
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;


    /**
     * 判断是否存在该bean的定义
     * @param beanName bean的名称
     * @return 是否存在该bean的定义
     */
    boolean containsBeanDefinition(String beanName);


    /**
     * 获取所有的bean的定义的名称
     * @return
     */
    String[] getBeanDefinitionNames();

}
